package com.skyd.core.android.game;

/**
 * 带有缓冲的数值步进变化动作基类，不支持循环和持续时间设置
 * @author SkyD
 *
 * @param <T>
 */
public abstract class GameNumberBufferStepMotion<T extends Number> extends
		GameNumberStepMotion<T> {

	/**
	 * 构造函数
	 * 
	 * @param targetValue
	 *            目标值
	 * @param stepLength
	 *            步进长度
	 * @param tolerance
	 *            容差
	 * @param buffer
	 *            递减缓冲值比例，该值为0至1之间，代表每次递减的百分比
	 */
	public GameNumberBufferStepMotion(T targetValue, T stepLength, T tolerance,
			float buffer) {
		super(targetValue, stepLength, tolerance);
		setLessenBuffer(buffer);
	}

	@Override
	protected void updateSelf(GameObject obj) {
		super.updateSelf(obj);
		setStepLength(mul(getStepLength(),1-getLessenBuffer()));
	}
	
	/**
	 * 乘法运算
	 * 
	 * @param v1
	 *            值1
	 * @param v2
	 *            值2
	 * @return 运算结果
	 */
	protected abstract T mul(T v1, float v2);

	/**
	 * 初始值为0.1。 功能注释：递减缓冲值比例，该值为0至1之间，代表每次递减的百分比
	 */
	private float _LessenBuffer = 0.1f;

	/**
	 * 获取LessenBuffer。 功能注释：递减缓冲值比例，该值为0至1之间，代表每次递减的百分比
	 * 
	 * @return 当前的float类型的值
	 */
	public float getLessenBuffer() {
		return _LessenBuffer;
	}

	/**
	 * 设置LessenBuffer。 功能注释：递减缓冲值比例，该值为0至1之间，代表每次递减的百分比
	 * 
	 * @param value
	 *            要设置的float类型值
	 */
	public void setLessenBuffer(float value) {
		_LessenBuffer = value;
	}

	/**
	 * 设置LessenBuffer为其默认值(0.1)。 功能注释：递减缓冲值比例，该值为0至1之间，代表每次递减的百分比
	 */
	public void setLessenBufferToDefault() {
		setLessenBuffer(0.1f);
	}
}
